import pymysql
from dbutils.pooled_db import PooledDB
from typing import Dict, Any, Optional, List


# 定义多个数据库配置
db_configs = [
    {
        'name': 'ainvestdb',
        'db_config': {
            'host': '124.220.33.71',
            'user': 'root',
            'password': 'Fi2pRZNoWhSsbV0O',
            'port': 3306,
            'charset': 'utf8mb4',
            'cursorclass': pymysql.cursors.DictCursor,
            'database': 'quote_feature_data'
        }
    },
    {
        'name': 'ext_quote_data',
        'db_config': {
            'host': '124.220.33.71',
            'user': 'root',
            'password': 'Fi2pRZNoWhSsbV0O',
            'port': 3306,
            'charset': 'utf8mb4',
            'cursorclass': pymysql.cursors.DictCursor,
            'database': 'quote_feature_data'
        }
    },
    {
        'name': 'feature_quote_data',
        'db_config': {
            'host': '124.220.33.71',
            'user': 'root',
            'password': 'Fi2pRZNoWhSsbV0O',
            'port': 3306,
            'charset': 'utf8mb4',
            'cursorclass': pymysql.cursors.DictCursor,
            'database': 'feature_quote_data'
        }
    }
]

# 设置连接池默认参数
pool_config = {
    'mincached': 3,  # 连接池中空闲连接的初始数量
    'maxcached': 5,  # 连接池中空闲连接的最大数量
    'maxshared': 3,  # 共享连接的最大数量
    'maxconnections': 10,  # 创建连接池的最大数量
    'blocking': True,  # 超过最大连接时是否阻塞
    'maxusage': None,  # 连接的最大使用次数
    'setsession': [],  # 开始会话前执行的命令列表
    'ping': 0,  # 检查连接的状态
}


class MySQLPool:
    """MySQL连接池工具类，根据不同配置获取对应的连接池"""

    # 存储不同配置的连接池
    _pools = {}

    @classmethod
    def initialize(cls):
        """
        批量初始化多个数据库连接池
        Args:
            configs: 数据库配置列表，每个配置需包含name和db_config字段
        """
        for config in db_configs:
            config_name = config.get('name')
            db_config = config.get('db_config')

            if not config_name or not db_config:
                raise ValueError("配置项必须包含name和db_config字段")
            cls.get_pool(config_name, db_config)
    @classmethod
    def get_pool(cls, config_name: str, db_config: Optional[Dict[str, Any]] = None) -> PooledDB:
        """
        获取数据库连接池，如果不存在则创建

        Args:
            config_name: 配置名称，用于标识不同的连接池
            db_config: 数据库配置，包含host,port,user,password等参数

        Returns:
            PooledDB: 数据库连接池对象
        """
        # 如果配置不存在或需要更新，创建新的连接池
        if config_name not in cls._pools or db_config:
            if not db_config:
                raise ValueError(f"配置 {config_name} 不存在，需要提供db_config参数")

            # 创建连接池
            pool = cls._create_pool(db_config)
            cls._pools[config_name] = pool

        return cls._pools[config_name]

    @classmethod
    def _create_pool(cls, db_config: Dict[str, Any]) -> PooledDB:
        """
        创建数据库连接池

        Args:
            db_config: 数据库配置

        Returns:
            PooledDB: 数据库连接池对象
        """
        # 确保必要的配置项存在
        required_configs = ['host', 'port', 'user', 'password', 'database']
        for config in required_configs:
            if config not in db_config:
                raise ValueError(f"缺少必要的数据库配置项: {config}")

        # 创建连接池
        return PooledDB(
            creator=pymysql,  # 使用pymysql作为数据库连接驱动
            host=db_config['host'],
            port=db_config['port'],
            user=db_config['user'],
            password=db_config['password'],
            database=db_config['database'],
            charset=db_config.get('charset', 'utf8mb4'),
            cursorclass=pymysql.cursors.DictCursor,  # 使用字典游标
            **pool_config
        )

    @classmethod
    def close_all(cls):
        """关闭所有连接池"""
        for pool in cls._pools.values():
            pool.close()
        cls._pools.clear()